package com.wz.leetcode.array;

/**
 * @Author : Wang Zhen.
 * @Date : Created in 19:40 2022/9/24
 * @Description : 特别注意这个区间的含义，数学归纳法证明 循环不变式 始终成立即可
 * x x x 0 ... 0 x
 *       p ...   q
 * @Modified By   :
 * @Version :
 */
public class N0283_MovingZeros {
    public void moveZeroes(int[] nums) {
        // [0, p)全为非0
        int p = 0;
        // [p, q)全为0
        int q = 0;
        while(q < nums.length) {
            if (nums[q] != 0) {
                swap(nums, p, q);
                // 这里q位置不为0，交换给p，然后p向右移动1位
                // 保证了[0, p)全为非0的条件
                p++;
            }

            q++;
        }
    }

    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
